home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / xpicw / xpicw110.lzh / Source / wl_load.s < prev    next >
Encoding:
Text File  |  1997-07-11  |  5.4 KB  |  278 lines

  1. *    ワイプライブラリ読み込み
  2. *
  3. * in  : d0.l = 検索モード
  4. *        bit0 = 1 : カレントディレクトリから検索
  5. *        bit1 = 1 : 自分自身のパスからも検索
  6. *        bit2 = 1 : 環境変数 WL_path からも検索
  7. *    a0.l = ワイプライブラリ名
  8. *
  9. * out : d0.l = 0 ; 読み込み成功
  10. *         =-1 ; 読み込みエラー
  11. *         =-2 ; メモリ不足
  12. *         =-3 ; ワイプライブラリでは無い
  13. *    d1.l = ワイプライブラリの最高速度
  14. *    a0.l = ワイプライブラリのメモリブロック
  15. *    a1.l =     〃   のプログラム部分のアドレス
  16. *
  17. * 備考 : スタックを 400 bytes 程度消費します
  18. *    また、DOS _GETENV を使っているため、スーパーバイザモードで
  19. *    呼び出す時は Human68K のバージョンに注意して下さい
  20. *    ( ver3 の DOS コール移動の件)
  21. *
  22. * バージョンアップ履歴
  23. *    97/04/10 : 初版
  24. *    97/07/11 : DOS _EXEC でワイプライブラリを読むようにした(キャッシュ対策)
  25. *          副作用で LZX で圧縮した .WL も使えるようになった(要 LZXLOADER.SYS)
  26. *           コメントスキップで2バイト文字も考慮するようにした
  27.  
  28.     .include    DOSCALL.MAC
  29.  
  30.     .xdef    wl_load
  31.  
  32.  
  33.     .offset    -92    * スタック上のワーク
  34. work_path:
  35.     .ds.b    92
  36.  
  37.  
  38.     .text
  39.     .even
  40. wl_load:
  41.     link    a6,#work_path
  42.     movem.l    d2-d7/a2-a5,-(sp)
  43.  
  44.     move.l    d0,d2        * d2.l = 検索モード
  45.     movea.l    a0,a3        * a3.l = ワイプライブラリ名
  46.  
  47.  
  48.     move.l    #-1,-(sp)
  49.     DOS    _MALLOC
  50.     addq.w    #4,sp
  51.     andi.l    #$00fffffe,d0
  52.     move.l    d0,a4        * a4.l = 確保できるメモリサイズ
  53.     move.l    d0,-(sp)
  54.     DOS    _MALLOC
  55.     addq.w    #4,sp
  56.     tst.l    d0
  57.     bmi    less_mem_err
  58.     move.l    d0,a2        * a2.l = ワイプライブラリを読み込むアドレス
  59.  
  60.  
  61. ****    ****
  62.     btst.l    #0,d2    * カレントディレクトリから検索するか?
  63.     beq    not_current
  64.  
  65.             * 渡されたファイル名そのままでオープン
  66.     bsr    open
  67.     bpl    comment_check
  68.             * 拡張子 '.WL' をつけてもう一度オープン
  69.     lea.l    work_path(a6),a0
  70.     bsr    copy_fname
  71.     bsr    copy_ext
  72.     lea.l    work_path(a6),a0
  73.     bsr    open
  74.     bpl    comment_check
  75. not_current:
  76.  
  77.  
  78.     btst.l    #1,d2    * 自分自身のパスから検索するか?
  79.     beq    not_my_path
  80.  
  81.             * 自分自身のパス名を付けてもう一度オープン
  82.     lea.l    work_path(a6),a0
  83.     bsr    copy_my_path
  84.     bsr    copy_fname
  85.     lea.l    work_path(a6),a0
  86.     bsr    open
  87.     bpl    comment_check
  88.             * 自分自身のパス名と拡張子 '.WL' をつけてもう一度オープン
  89.     lea.l    work_path(a6),a0
  90.     bsr    copy_my_path
  91.     bsr    copy_fname
  92.     bsr    copy_ext
  93.     lea.l    work_path(a6),a0
  94.     bsr    open
  95.     bpl    comment_check
  96. not_my_path:
  97.  
  98.  
  99.     btst.l    #2,d2    * 環境変数の指すパスから検索するか?
  100.     beq    open_err
  101.  
  102.             * 環境変数の指すパス名を付けてもう一度オープン
  103.     lea.l    work_path(a6),a0
  104.     bsr    copy_env
  105.     bsr    copy_fname
  106.     lea.l    work_path(a6),a0
  107.     bsr    open
  108.     bpl    comment_check
  109.             * 環境変数の指すパス名と拡張子 '.WL' をつけてもう一度オープン
  110.     lea.l    work_path(a6),a0
  111.     bsr    copy_env
  112.     bsr    copy_fname
  113.     bsr    copy_ext
  114.     lea.l    work_path(a6),a0
  115.     bsr    open
  116.     bpl    comment_check
  117.     bmi    open_err
  118.  
  119.  
  120. ****    ****
  121. comment_check:
  122.     move.l    d0,d6        * d6.l = ファイルサイズ
  123.  
  124.             * 最大限確保したメモリブロックを切り詰める
  125.     move.l    d6,-(sp)
  126.     pea.l    (a2)
  127.     DOS    _SETBLOCK
  128.     addq.w    #8,sp
  129.  
  130.  
  131.     movea.l    a2,a1
  132.  
  133.     cmpi.l    #'WL10',(a1)+    * ヘッダ 'WL10' をチェック
  134.     bne    not_wl_err
  135. comment_skip_loop:
  136.     move.b    (a1)+,d0    * d0.b = 1文字読む
  137.     bpl    is_半角        * $00-$7f は半角
  138.     cmpi.b    #$a0,d0
  139.     bcs    @f
  140.     cmpi.b    #$df,d0        * $a0-$df は半角
  141.     bls    is_半角
  142. @@:    cmpi.b    #$80,d0
  143.     beq    is_2バイト半角    * $80xx は2バイト半角
  144.     cmpi.b    #$f0,d0
  145.     bcs    is_全角
  146.     cmpi.b    #$f3,d0
  147.     bls    is_2バイト半角    * $f0xx-$f3xx は2バイト半角
  148. is_全角:
  149. is_2バイト半角:
  150.     addq.w    #1,a1        * 2バイト文字の2バイト目は読み捨てる
  151.     bra    comment_skip_loop
  152.  
  153. is_半角:
  154.     cmpi.b    #$1a,d0        * コメントをスキップ
  155.     bne    comment_skip_loop
  156.  
  157.  
  158.     move.l    a1,d0        * コメントの後の
  159.     addq.l    #1,d0        * .even を補正
  160.     lsr.l    d0
  161.     lsl.l    d0
  162.     movea.l    d0,a1        * a1.l = プログラム部分のアドレス(返り値)
  163.  
  164.     move.l    #-1,-(sp)    * ワイプ速度問い合わせ
  165.     clr.l    -(sp)        * ダミー
  166.     clr.l    -(sp)        * ダミー
  167.     jsr    (a1)
  168.     lea.l    12(sp),sp
  169.     move.l    d0,d1        * d1.l = 速度最高値(返り値)
  170.  
  171.     moveq.l    #0,d0        * d0.l = エラーコード(返り値)
  172. load_rts:
  173.     movea.l    a2,a0        * a0.l = メモリブロック(返り値)
  174.     movem.l    (sp)+,d2-d7/a2-a5
  175.     unlk    a6
  176.     rts
  177.  
  178.  
  179. ****    ****
  180. open:            * in  : a0.l = ファイル名
  181.             *    a2.l = 読み込むアドレス
  182.             *    a4.l = ↑のメモリブロックの大きさ
  183.     move.l    a2,d0
  184.     add.l    a4,d0
  185.     move.l    d0,-(sp)    * リミットアドレス
  186.     pea.l    (a2)        * ロードアドレス
  187.     pea.l    (a0)        * ファイル名
  188.     move.b    #1,(sp)        * .R 形式としてロード
  189.     move.w    #3,-(sp)    * MD
  190.     DOS    _EXEC
  191.     lea.l    14(sp),sp
  192.     tst.l    d0
  193.     rts
  194.  
  195.  
  196. copy_fname:        * スタック上にワイプライブラリ名をコピー
  197.             * out : a0.l = コピー先の次のアドレス
  198.     movem.l    a1,-(sp)
  199.  
  200.     movea.l    a3,a1
  201. @@:    move.b    (a1)+,(a0)+
  202.     bne    @b
  203.     subq.w    #1,a0
  204.  
  205.     movem.l    (sp)+,a1
  206.     rts
  207.  
  208.  
  209. copy_ext:        * 拡張子 '.WL' をコピー
  210.             * out : a0.l = コピー先の次のアドレス
  211.     move.b    #'.',(a0)+
  212.     move.b    #'W',(a0)+
  213.     move.b    #'L',(a0)+
  214.     clr.b    (a0)+
  215.     rts
  216.  
  217.  
  218. copy_my_path:        * 自分自身のパス名をコピー
  219.             * out : a0.l = コピー先の次のアドレス
  220.     movem.l    a1,-(sp)
  221.  
  222.     DOS    _GETPDB
  223.     movea.l    d0,a1
  224.     adda.w    #$80-$10,a1    * a1.l = 自分自身のパス
  225. @@:    move.b    (a1)+,(a0)+
  226.     bne    @b
  227.     subq.w    #1,a0
  228.  
  229.     movem.l    (sp)+,a1
  230.     rts
  231.  
  232.  
  233. copy_env:        * 環境変数の指すパス名をコピー
  234.             * out : a0.l = コピー先の次のアドレス
  235.     link    a6,#-256
  236.     movem.l    a1,-(sp)
  237.  
  238.     pea.l    -256(a6)
  239.     clr.l    -(sp)
  240.     pea.l    WL_path_strZ(pc)
  241.     DOS    _GETENV
  242.     lea.l    12(sp),sp
  243.     tst.l    d0
  244.     bmi    copy_env_rts
  245.  
  246.     moveq.l    #90-1,d0
  247.     lea.l    -256(a6),a1
  248. @@:    move.b    (a1)+,(a0)+
  249.     dbeq    d0,@b
  250.     subq.w    #1,a0
  251.  
  252.     moveq.l    #0,d0
  253. copy_env_rts:
  254.     movem.l    (sp)+,a1
  255.     unlk    a6
  256.     rts
  257.  
  258.  
  259. ****    ****
  260. open_err:
  261.     moveq.l    #-1,d0
  262.     bra    load_rts
  263.  
  264. less_mem_err:
  265.     moveq.l    #-2,d0
  266.     bra    load_rts
  267.  
  268. not_wl_err:
  269.     moveq.l    #-3,d0
  270.     bra    load_rts
  271.  
  272.  
  273. ****    ****
  274. WL_path_strZ:
  275.     .dc.b    'WL_path',0
  276.  
  277.     .even
  278.